package IODemo;

import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.IOException;
import java.io.InputStream;

public class IODemo4 {
    public static void main(String[] args) throws IOException {
//        InputStream inputStream = null;
//        try {
//            inputStream = new FileInputStream("./test.txt");
//        }
//        //创建对象的过程就是打开文件的过程.
//        //InputStream是一个抽象类,所以只能实例化他的子类FileInputStream从文件来读取输入流
//        //FileNotFoundException这个异常时IOexception的子类,如果路径不正确就会抛出异常
//        //关闭文件
//        finally {
//            inputStream.close();
//        }
        //如果关闭直接这么写,则很有可能关闭不了,如果中间的逻辑出现return或者出现异常就执行不到了
        //使用final
        //可以理解为释放了文件资源
        //一个运行起来的程序就是进程,就会有一个或者多个PCB来进行表示
        //其中有一个属性为文件描述符表,记录了当前进程打开了多少文件
        //顺序表/数组  数组中每个元素都是一个结构体,用来储存文件的信息
        //如果我们只使用但是不关闭文件就会达到数组长度上限,当文件描述符表满了之后后序打开文件就会失败,进一步引发逻辑问题
        //内存泄漏malloc一个内存没有free掉,此时若是没有free掉,内存就会泄露
        //因为java内置了GC,一定周期释放内存,不用担心内存泄漏问题了
         //泄漏这种问题的不会立刻显现出来,在一段时间之后才会发生,此时出现问题就可能不会被及时发现改正

        //java中的try操作还有一种形式,try with resources
        try(InputStream inputStream = new FileInputStream("./test.txt")) {
            //此时我们的代码只要出了try括号中的代码块,编译器就会自动帮助我们调用inputStream.close();
            //在try括号里边的类必须实现closeable接口

            //使用read相当于定义一个数组传入到read中,由read内部对数组进行传输
//            byte[] buffer = new byte[1024];
//            inputStream.read(buffer);
            //read的三种构造方法
            //1.不传参返回值为int类型,实际上为byte类型不过是多加了一个-1,读取一个字节 0 - 255 如果未读取到返回-1
            //2.传参,传一个数组,返回int类型,和第三种情况类似,read会试图把数组填满,如果未填满便会返回实际读取的字节个数
            //3.offset偏移量 我们从offset位置开始写,int len 写的长度最多是多少
//             while(true){
//                 int a = inputStream.read();
//                 if(a == -1){
//                     break;
//                 }
//                 System.out.printf("%x ",a);//16进制进行打印
//                 //如果文件带有中文,打印出的字节就是utf8编码的字节
//                 //此时是一次读一个字节
            byte[] buffer = new byte[1024];
            int n = inputStream.read(buffer);
//            for (int i = 0; i < n; i++) {
//                System.out.printf("%x ",buffer[i]);
//                //如果想要打印中文就需要构造string
//            }
            String s = new String(buffer,0,n);//从第0个字节开始,到第n个字节构造字符串
            System.out.println(s);
        }
    }
}
